#include <iostream>

#if PR_DEBUG == 1
#define LOG(x) std::cout << x << std::endl;
#elif defined(PRE_RELEASE)
#define LOG(x)
#endif

class Log
{
public:
    enum Level{
        levelError = 0,
        levelWarning,
        levelInfo
    };

private:
    Level m_LogLevel = levelWarning;

public:
    void SetLevel(Level level)
    {
        m_LogLevel = level;
    }

    void Error(const char* message)
    {
        if(m_LogLevel >= levelError) 
           std::cout << "[ERROR]: " << message << std::endl;
    }

   void Warn(const char* message)
    {
        if(m_LogLevel >= levelWarning) 
           std::cout << "[WARN]: " << message << std::endl;
    }

    void Info(const char* message)
    {
        if(m_LogLevel >= levelInfo) 
           std::cout << "[INFO]: " << message << std::endl;
    }    
};

int main()
{
    Log log;
    log.SetLevel(log.levelWarning);
    log.Warn("hello");
    log.Error("hello");
    log.Info("helllo");
}